package com.store.pet.petstore.util;


import android.net.Uri;
import android.os.Looper;
import android.util.Log;

import com.blankj.utilcode.util.LogUtils;

import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import static java.lang.String.valueOf;

/**
 * 封装的OKHttp请求
 */
public class OKHttpUtils {

    //定义接口回调
    public interface ServerCallBack{
        void onSuccess(String data);
        void onFailed(String message);
    }

    public static void requestData(final String url, final Map<String,Object> map,final ServerCallBack callBack){

        try{
            OkHttpClient client = new OkHttpClient();
            FormBody.Builder builder = new FormBody.Builder();
            for(String key : map.keySet()){
                Object o = map.get(key);
                builder.add(key,o.toString());
                LogUtils.e(key,o.toString());
            }
            String requestUrl = Constant.HOST+url;
            LogUtils.e("请求接口",requestUrl);
            RequestBody body = builder.build();
            Request request = new Request.Builder()
                    .url(requestUrl)
                    .post(body)
                    .build();
            Call call = client.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    callBack.onFailed(null);
                    LogUtils.e("请求失败");
                    LogUtils.e(e.getMessage());
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if(response.isSuccessful()){
                        Looper.prepare();
                        String data = response.body().string();
                        LogUtils.e("请求成功",data);
                        callBack.onSuccess(data);
                    }
                }
            });
        }catch (Exception e){
            e.printStackTrace();
        }
    }

//    /**
//     * 上传图片和其他参数
//     * @param url  接口
//     * @param picturePath  图片路径
//     * @param name  宠物名
//     * @param type  宠物类型
//     * @param price  宠物价格
//     * @param sellerId  卖家ID
//     * @param birthday  宠物生日
//     * @param describe  宠物描述
//     * @param callBack  回调
//     */
//    public static void postPicture(final String url, final String picturePath,final String name,
//                                   final int type,final String price, final int sellerId,final String birthday,
//                                   final String describe,final ServerCallBack callBack){
//        try{
//            OkHttpClient client = new OkHttpClient();
//
//            /**
//             * 参数请求体
//             */
//            FormBody paramsBody = new FormBody.Builder()
//                    .add("name",name)
//                    .add("type",String.valueOf(type))
//                    .add("price",price)
//                    .add("sellerid",String.valueOf(sellerId))
//                    .add("birthday",birthday)
//                    .add("description",describe)
//                    .build();
//
//            /**
//             * 文件请求体
//             */
//            MediaType mediaType = MediaType.parse("application/octet-stream");
//            File file = new File(picturePath);
//            RequestBody fileBody = RequestBody.create(mediaType,file);
//
//            /**
//             * 混合上传
//             */
//            RequestBody multipartBody = new MultipartBody.Builder()
//                    .setType(MultipartBody.ALTERNATIVE)
//                    .addPart(Headers.of("Content-Disposition",
//                            "form-data; name=\"params\"")
//                            ,paramsBody)
//                    .addPart(Headers.of("Content-Disposition",
//                            "form-data; name=\"imgfile\"; filename=\""+file.getName()+"\"")
//                            , fileBody)
//                    .build();
//
//            /**
//             * 上传
//             */
//            Request request = new Request.Builder()
//                    .url(Constant.HOST+url)
//                    .addHeader("User-Agent","android")
//                    .header("Content-Type","text/html; charset=utf-8;")
//                    .post(multipartBody)//传参数、文件或者混合，改一下就行请求体就行
//                    .build();
//
//            client.newCall(request).enqueue(new Callback() {
//                @Override
//                public void onFailure(@NotNull Call call, @NotNull IOException e) {
//                    callBack.onFailed(null);
//                    LogUtils.e("请求失败");
//                    LogUtils.e(e.getMessage());
//                }
//
//                @Override
//                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//                    if(response.isSuccessful()){
//                        Looper.prepare();
//                        String data = response.body().string();
//                        LogUtils.e("请求成功",data);
//                        callBack.onSuccess(data);
//                    }
//                }
//            });
//
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }

    /**
     * 上传图片和其他参数
     * @param url  接口
     * @param callBack  回调
     */
    public static void postPicture(final String url,File file,final Map<String,Object> map,final ServerCallBack callBack){
        try{
            OkHttpClient client = new OkHttpClient();

            // form 表单形式上传
            MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
            if (file != null) {
                // MediaType.parse() 里面是上传的文件类型。
                RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);
                String filename = file.getName();
                // 参数分别为， 请求key ，文件名称 ， RequestBody
                requestBody.addFormDataPart("file", filename, body);
            }
            if (map != null) {
                // map 里面是请求中所需要的 key 和 value
                Set<Map.Entry<String, Object>> entries = map.entrySet();
                for (Map.Entry entry : entries) {
                    String key = valueOf(entry.getKey());
                    String value = valueOf(entry.getValue());
                    Log.d("HttpUtils", "key=="+key+",value=="+value);
                    requestBody.addFormDataPart(key,value);
                }
            }
            Request request = new Request.Builder()
                    .url(Constant.HOST+url)
                    .post(requestBody.build())
                    .build();
            // readTimeout("请求超时时间" , 时间单位);
            LogUtils.e(Constant.HOST+url);
            client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                    callBack.onFailed(null);
                    LogUtils.e("请求失败");
                    LogUtils.e(e.getMessage());
                }

                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    if(response.isSuccessful()){
                        Looper.prepare();
                        String data = response.body().string();
                        LogUtils.e("请求成功",data);
                        callBack.onSuccess(data);
                    }
                }
            });

//            /**
//             * 参数请求体
//             */
//            FormBody paramsBody = new FormBody.Builder()
//                    .add("name",name)
//                    .add("type",valueOf(type))
//                    .add("price",price)
//                    .add("sellerid",valueOf(sellerId))
//                    .add("birthday",birthday)
//                    .add("description",describe)
//                    .build();
//
//            /**
//             * 文件请求体
//             */
//            MediaType mediaType = MediaType.parse("application/octet-stream");
//            File file = new File(picturePath);
//            RequestBody fileBody = RequestBody.create(mediaType,file);
//
//            /**
//             * 混合上传
//             */
//            RequestBody multipartBody = new MultipartBody.Builder()
//                    .setType(MultipartBody.ALTERNATIVE)
//                    .addPart(Headers.of("Content-Disposition",
//                            "form-data; name=\"params\"")
//                            ,paramsBody)
//                    .addPart(Headers.of("Content-Type",
//                            "form-data; name=\"file\"; filename=\""+file.getName()+"\"")
//                            , fileBody)
//                    .build();
//
//            /**
//             * 上传
//             */
//            Request request = new Request.Builder()
//                    .url(Constant.HOST+url)
//                    .addHeader("User-Agent","android")
//                    .header("Content-Type","multipart/form-data")
//                    .post(multipartBody)//传参数、文件或者混合，改一下就行请求体就行
//                    .build();
//
//            client.newCall(request).enqueue(new Callback() {
//                @Override
//                public void onFailure(@NotNull Call call, @NotNull IOException e) {
//                    callBack.onFailed(null);
//                    LogUtils.e("请求失败");
//                    LogUtils.e(e.getMessage());
//                }
//
//                @Override
//                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//                    if(response.isSuccessful()){
//                        Looper.prepare();
//                        String data = response.body().string();
//                        LogUtils.e("请求成功",data);
//                        callBack.onSuccess(data);
//                    }
//                }
//            });

        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

